package pl.edu.pw.elka.tinyrepo.client;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.StringTokenizer;

import pl.edu.pw.elka.tinyrepo.client.common.IncomingFile;
import pl.edu.pw.elka.tinyrepo.client.common.IncomingObject;
import pl.edu.pw.elka.tinyrepo.common.HTTPHeaderType;
import pl.edu.pw.elka.tinyrepo.common.Message;
import pl.edu.pw.elka.tinyrepo.common.Request;
import pl.edu.pw.elka.tinyrepo.common.Response;
import pl.edu.pw.elka.tinyrepo.common.StatusCode;
import pl.edu.pw.elka.tinyrepo.common.WebDAVMethod;

/**
 * Test z wykorzystaniem IncomingFile
 * 
 * @author Anna Stępień
 * @version 15-12-2011
 *
 */
public class GETClientTest {

   /**
    * @param args
    * @throws IOException 
    */
   public static void main(String[] args) throws IOException {
      InputStream in = null;
      OutputStream out = null;
      try {
         Socket s = new Socket("localhost", 8008) ; // laczymy sie do bramy
         Request req = new Request(WebDAVMethod.GET, "/plik");
         req.write(s.getOutputStream()); // wyslij request
         in = s.getInputStream();
         Response res = new Response();
         res.setFirstLine(Message.readInputLine(in)); // czytanie response line
         System.out.println(res.getFirstLine());
         res.readHeaders(in);
//         if(res.getStatusCode() == StatusCode.MOVED_PERMANENTLY)
         // sprawdzamy co dostalismy - w tym przykladzie wiadomo ze bedzie to MOVED_PERMANENTLY - wiec nie sprawdzam tego
         String location = res.getHeader(HTTPHeaderType.LOCATION); // wyluskujemy naglowek location
         
         System.out.println("Brama mowi ze redirect do: "+location);
         s.close(); // zamykamy polaczenie z brama
         
         // location jest w postaci serwer/id_pliku - trzeba to i to wydobyc
         StringTokenizer t = new StringTokenizer(location, "/");
         String host = t.nextToken(); 
         System.out.println(host);
         String id = t.nextToken();
         // host sklada sie z adresu serwera i numeru portu - trzeba to jeszcze rozdzielic
         
         StringTokenizer t2 = new StringTokenizer(host, ":");
         String address = t2.nextToken();
         String port = t2.nextToken();
         // otwieramy polaczenie z serwerem danych
         
         Socket s2 = new Socket(address, Integer.parseInt(port)); 
         // i analogicznie jak z wysylaniem do bramy: wyslac request, sprawdzic, odebrac dane
         Request req2 = new Request(WebDAVMethod.GET, id); // tutaj juz podajemy id pliku ktore dostalismy od bramy
         req2.write(s2.getOutputStream());
         InputStream in2 = s2.getInputStream();
         Response res2 = new Response();
         res2.setFirstLine(Message.readInputLine(in2));
         res2.readHeaders(in2);
         //System.out.println(res.getFirstLine());
         //System.out.println(res.headers);
         // i teraz czytamy plik
         //Integer amount = Integer.getInteger(res.getHeader(HTTPHeaderType.CONTENT_LENGTH)); // tu optymistycznie zakladam ze rozmiar wartosc jest poprawna
         // TODO trzeba doczytywac dane!!! 
         if(res2.getStatusCode() == StatusCode.OK) { // zapowiada sie ciekawie
     
            File f = new File("/home/ania/Pulpit/RMItest");
            out = new FileOutputStream(f);
            byte[] buffer = new byte[25]; // bufor do odczytywania danych
            int c = 0;
            while((c = in2.read(buffer)) != -1) { // czytamy ze strumienia od serwera danych
               //System.out.println("Odczytalem ilosc "+c);
               //System.out.println("Odczytałem: "+new String(buffer));
               out.write(buffer, 0, c);
            }
            
         }
         
      } catch (Exception e) {
         e.printStackTrace();
      }
      finally {
         in.close();
         out.close();
      }
   }

}
